package com.turing.post.transaction.util;

import java.math.BigInteger;
import java.util.Date;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Remote;

import com.turing.post.report.util.MerchantDaySettlement;
import com.turing.post.util.PCPSApplicationException;
import com.turing.post.util.PCPSWebInput;

/**
 * 商户交易流水接口
 * 
 * @author ZXL
 * 
 */
@Remote
@Local
public interface MchTradDetailDao {

	/**
	 * 根据主键查询商户交易明细
	 * 
	 * @param mtd
	 * @return
	 */
	public MchTradDetail getMchTradDetailByPrimaryKey(MchTradDetail mtd);

	/**
	 * 商户交易流水插入
	 * 
	 * @param mtd
	 *            商户交易流水对象
	 * @throws PCPSApplicationException
	 *             异常信息
	 */
	public void insert(MchTradDetail mtd) throws PCPSApplicationException;

	/**
	 * 商户交易流水修改
	 * 
	 * @param mtd
	 *            商户交易流水对象
	 * @throws PCPSApplicationException
	 *             异常信息
	 */
	public void update(MchTradDetail mtd) throws PCPSApplicationException;

	/**
	 * 重置某交易的other字段
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            交易日期
	 * @param tranSeqNo
	 *            交易流水号
	 * @return 记录数
	 */
	public int resetMchTradDetailOtherInf(String merchantNo, Date tranDate,
			String tranSeqNo) throws PCPSApplicationException;

	/**
	 * 根据三要素检索商户流水
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            交易日期
	 * @param mrchReqSeqNo
	 *            交易流水号
	 * @return 商户交易流水对象列表
	 */
	public List<MchTradDetail> getMchTradDetailByMrchSeqNo(String merchantNo,
			Date tranDate, String mrchReqSeqNo);

	/**
	 * 根据三要素检索商户流水历史
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            交易日期
	 * @param mrchReqSeqNo
	 *            交易流水号
	 * @return 商户交易流水对象列表
	 */
	public List<MchTradDetail> getMchTradDetailByMrchSeqNoFromHistory(
			String merchantNo, Date tranDate, String mrchReqSeqNo);

	/**
	 * 根据三要素检索商户流水历史
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            交易日期
	 * @param tranSeqNo
	 *            交易流水号
	 * @return 商户交易流水对象列表
	 */
	public List<MchTradDetail> getMchTradDetailByTranSeqNoFromHistory(
			String merchantNo, Date tranDate, String tranSeqNo);

	/**
	 * 根据商户号统计该日累计消费金额及笔数
	 * 
	 * @param merchantNo
	 * @param tranDate
	 * @return
	 */
	public MchTradDetail getMchTradDetailDayPaidSummary(String merchantNo,
			Date tranDate);

	/**
	 * 根据商户号统计该日累计充值金额及笔数
	 * 
	 * @param merchantNo
	 * @param tranDate
	 * @return
	 */
	public MchTradDetail getMchTradDetailDayDepositSummary(String merchantNo,
			Date tranDate, Integer cycleLimit);

	/**
	 * 统计指定卡指定日期在商户处的充值合计
	 * 
	 * @param cardNo
	 * @param tranDate
	 * @return
	 */
	public BigInteger getDayDepositByCardNo(String cardNo, Date tranDate);

	/**
	 * 迁移交易流水到历史表中
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            帐务日期
	 */
	public void migrateMchTradDetailToHistory(String merchantNo, Date tranDate);

	/**
	 * 迁移指定历史交易流水到当日流水表中
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param tranDate
	 *            帐务日期
	 * @param tranSeqNo
	 *            流水号
	 */
	public void migrateMchTradDetailFromHistory(String merchantNo,
			Date tranDate, String tranSeqNo);

	/**
	 * 根据发卡商号、某日、商户号按商户号汇总交易日结数据
	 * 
	 * @param issueCompanyNo
	 *            发卡商号
	 * @param merchantNo
	 *            商户号(可选)
	 * @param tranDate
	 *            帐务日期
	 * @return
	 */
	public List<MerchantDaySettlement> getAllMerchantDaySettlementByMerchantNo(
			String issueCompanyNo, String merchantNo, Date tranDate);

	/**
	 * 根据发卡商编号及交易日期检索有商户列表
	 * 
	 * @param issueCompanyNo
	 * @param tranDate
	 * @return
	 */
	public List<String> getAllMerchantListByIssueCompanyNoAndTranDate(
			String issueCompanyNo, Date tranDate);

	/**
	 * 根据商户号、日期统计交易数据
	 * 
	 * @param merchantNo
	 * @param tranDate
	 * @return
	 */
	public MrchSettResult getMrchSettResultByMerchantNo(String merchantNo,
			Date tranDate);

	/**
	 * 根据商户号、终端号以及批次号统计交易数据
	 * 
	 * @param merchantNo
	 * @param terminalNo
	 * @param batchNo
	 * @return
	 */
	public MrchSettResult getMrchSettResultByTerminalBatchNo(String merchantNo,
			String terminalNo, String batchNo);

	/**
	 * 商户交易流程查询
	 * 
	 * @param merchantNo
	 *            商户号
	 * @param mrchBrchNo
	 *            商户机构号
	 * @param terminalNo
	 *            终端号
	 * @param startTime
	 *            起始时间
	 * @param endTime
	 *            终止时间
	 * @param startAmount
	 *            起始金额
	 * @param endAmount
	 *            终止金额
	 * @param tranCode
	 *            交易码
	 * @param page
	 *            页码
	 * @return
	 */
	public List<MchTradDetail> getMchTradDetailListByCondition(
			String issueCompanyNo, String merchantNo, String mrchBrchNo,
			String terminalNo, String startTime, String endTime,
			BigInteger startAmount, BigInteger endAmount, String tranCode,
			String cardNo, Integer page);

	public Integer getMchTradDetailTotalByCondition(String issueCompanyNo,
			String merchantNo, String mrchBrchNo, String terminalNo,
			String startTime, String endTime, BigInteger startAmount,
			BigInteger endAmount, String tranCode, String cardNo);

	/**
	 * 报表 卡-11：西邮寄卡商户渠道充值明细表
	 * 
	 * @param webInput
	 * @param merchantNo
	 * @param merchantBrchNo
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public List<Object[]> getDepositReportListByCondition(
			PCPSWebInput webInput, String merchantNo, String merchantBrchNo,
			String startTime, String endTime);

	/**
	 * 报表 卡-12：西邮寄卡商户渠道充值统计表
	 * 
	 * @param webInput
	 * @param merchantNo
	 * @param merchantBrchNo
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public List<Object[]> getDepositReportCountByCondition(
			PCPSWebInput webInput, String merchantNo, String merchantBrchNo,
			String startTime, String endTime);

	/**
	 * 卡-7:卡消费日报明细表
	 * 
	 * @param webInput
	 * @param saleBranchNo
	 * @param isSingle
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	public List<Object[]> getCardConsumeDetailReportByCondition(
			PCPSWebInput webInput, String branchNo, String starttranDate,
			String endtranDate);

	/**
	 * 商户POS交易日报表
	 * 
	 * @param webInput
	 * @param date
	 * @return
	 */
	public List<Object[]> getMchPOSTradDetailDaySettReport(
			PCPSWebInput webInput, String date);

	/**
	 * 根据时间段检索商户交易流水及商户历史交易流水，预警情况
	 * 
	 * @param sratTime
	 *            起始时间
	 * @param endTime
	 *            终止时间 return list<Object[]>
	 */
	public List<Object[]> getProxybuyerSaleOrderNum(String sratTime,
			String endTime);

	/**
	 * 汇总某商户某日联机交易(不包含调帐)
	 * 
	 * @param merchantNo
	 * @param tranDate
	 * @return
	 */
	public BigInteger[] checkAccountSummary(String merchantNo, Date tranDate);

	/**
	 * 根据交易日期获取实名持卡人交易信息 预警规则:同一实名制个人客户，不同卡号N天内刷卡消费累计超过N元
	 * 
	 * @param issueCompanyNo
	 * @param amount
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getRealNameCardFromMchTradDetail(
			String issueCompanyNo, String startDate, String endDate,
			String cards);

	/**
	 * 判断是否符合累计金额限制 预警规则:同一实名制个人客户，不同卡号N天内刷卡消费累计超过N元
	 * 
	 * @param issueCompanyNo
	 * @param startDate
	 * @param endDate
	 * @param cards
	 * @return
	 */
	public boolean isEnoughAmountCardsFromMchTradDetail(String issueCompanyNo,
			String startDate, String endDate, String cards, BigInteger amount);

	/**
	 * 根据交易时间，发卡商编号,规则笔数 预警规则：同一卡号1小时内发生超过10笔的交易 根据卡号分组检索
	 */
	public List<Object[]> getMchTradDetailByTime(String issuecompanno,
			Date trandate, int number);

	/**
	 * 根据卡号,账务日期获取交易明细
	 * 
	 * @param cardno
	 * @param tranDate
	 * @return
	 */
	public List<MchTradDetail> getMchTradDetailByCardNoAndTranDate(
			String cardno, Date tranDate);

	/**
	 * 根据卡号,账务日期获取交易明细总数
	 * 
	 * @param cardno
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public Integer getMchTradDetailByCardNoAndTranDate(String cardno,
			Date startDate, Date endDate, Date tranDate);

	/**
	 * 根据交易时间，发卡商编号,卡号 查询
	 */
	public List<MchTradDetail> getMchTradDetailByCardNo(Date startdate,
			Date enddate, String cardno, Date tranDate);

	/**
	 * 获取N天内渠道交易笔数（N为预警规则参数） 预警规则：对于N天内无交易的渠道，系统即进行风险预警
	 * 
	 * @param tranDate
	 * @param days
	 * @param issueCompanyNo
	 * @return
	 */
	public List<Object[]> getMchDealSum(Date tranDate, int days,
			String issueCompanyNo);

	/**
	 * 获取卡在一天内小额交易的次数 预警规则：同一张卡，同一天小额（小于100元）多次（五次以上）的刷卡
	 * 
	 * @return
	 */
	public List<Object[]> getCardDealSum(Date tranDate, BigInteger amount);

	/**
	 * 根据卡号获取卡金额小于一定数量的消费详细
	 * 
	 * @param cardNo
	 * @param amount
	 * @return
	 */
	public List<Object[]> getMchTradDetailByCardLastDeal(String issueCompany,
			String cardNo, BigInteger amount, Date tranDate);

	/**
	 * 预警规则13 获取交易明细
	 * 
	 * @param issueCompanyNo
	 *            发卡商号
	 * @param amount
	 *            交易金额
	 * @param dayNum
	 *            天数
	 * @param date
	 *            当前发卡商账务日期
	 * @return
	 */
	public List<MchTradDetail> getAlarmRule13MchTradDetailListByCond(
			String icNo, String terminalNo, String startDate, String endDate);

	/**
	 * 预警规则13 满足条件的终端号
	 * 
	 * @param icNo
	 * @param amount
	 * @param dayNum
	 * @param date
	 */
	public List<String> getAlarmRule13OverTermimalNoList(String icNo,
			BigInteger amount, String startDate, String endDate);

	/**
	 * 根据终端号获取商户号
	 * 
	 * @param terminalNo
	 * 
	 * @return
	 */
	public String getMerchantNoByTerminalNo(String icNo, String startDate,
			String endDate, String terminalNo);

	/**
	 * 获取超过规则金额限制的卡号集合同一卡号，一个月内刷卡消费累计超过N元
	 * 
	 * @param issueCompanyNo
	 * @param startDate
	 * @param endDate
	 * @param amount
	 * @return
	 */
	public List<Object[]> getCardsAmountLimitFromMrchTradDetail(
			String issueCompanyNo, String startDate, String endDate,
			BigInteger amount);

	/**
	 * 获取超过规则金额限制的流水信息，一个月内刷卡消费累计超过N元
	 * 
	 * @param issueCompanyNo
	 * @param startDate
	 * @param endDate
	 * @param amount
	 * @param cardNo
	 * @return
	 */
	public List<Object[]> getMrchTradDetailByCardNo(String issueCompanyNo,
			String startDate, String endDate, String cardNo);

	/**
	 * 预警规则19 满足条件的商户号
	 * 
	 * @param icNo
	 * @param amount
	 * @param dayNum
	 * @param date
	 */
	public List<String> getAlarmRule19OverMerchantNoList(String icNo,
			BigInteger amount, String startDate, String endDate);

	/**
	 * 预警规则19 同一商户号下的交易明细
	 * 
	 * @param merchantNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<MchTradDetail> getAlarmRule19MchTradDetailListByCond(
			String merchantNo, String startDate, String endDate);

	public MchTradDetail getMchTradDetailByMrchSeqNoFromMchTradDetail(
			String merchantNo, Date tranDate, String mrchReqSeqNo);

	/**
	 * 商户消费日报表
	 * 
	 * @param webInput
	 * @param tranDate
	 * @param merchantNoStr
	 * @return
	 */
	public List<Object[]> getMchTradDetailCountReport(PCPSWebInput webInput,
			String tranDate, String merchantNoStr);
}
